/**
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。

 

示例 1：



输入：height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出：6
解释：上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。 
示例 2：

输入：height = [4,2,0,3,2,5]
输出：9

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function (height) {
    //使用动态规划，分别求出左右两侧各个位置最大的值

    let length = height.length;
    let res = 0

    let leftMax = []
    let rightMax = []
    leftMax[0] = height[0]
    for (var i = 1; i < length; i++) {
        //取出左侧最大的值
        leftMax[i] = Math.max(height[i], leftMax[i - 1])
    }

    rightMax[length - 1] = height[length - 1]
    for (var j = length - 2; j >= 0; j--) {
        //取出右侧最大的值
        rightMax[j] = Math.max(height[j], rightMax[j + 1])
    }


    for (var i = 0; i < length; i++) {
        res = res + Math.min(leftMax[i], rightMax[i]) - height[i]
    }

    return res

};